﻿using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Data.Objects;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SPMS.Common
{
    /// <summary>
    /// <see cref="DBContext"/>的扩展方法。
    /// </summary>
    public static class DbContextExtensions
    {
        /// <summary>
        /// 使用指定的<see cref="SaveOptions"/>将所有更新保存到数据源。
        /// </summary>
        /// <param name="context">要执行保存操作的<see cref="DbContext"/>对象。</param>
        /// <param name="options">一个确定操作的行为的<see cref="SaveOptions"/>值。</param>
        /// <returns>在调用<c>SaveChanges</c>时处于<c>Added</c>、<c>Modified</c>或<c>Deleted</c>状态的对象数。</returns>
        public static int SaveChanges(this DbContext context, SaveOptions options)
        {
            //转调
            return ((IObjectContextAdapter)context).ObjectContext.SaveChanges(options);
        }

        /// <summary>
        /// 将所有更新保存到数据源并可选择重置对象上下文中的更改跟踪。
        /// </summary>
        /// <param name="context">要执行保存操作的<see cref="DbContext" />对象。</param>
        /// <param name="acceptChangesDuringSave">此参数是客户端事务支持所需的参数。 如果为<c>true</c>，则所有对象的更改跟踪都会在<c>SaveChanges(Boolean)</c>完成后重置。 如果为<c>false</c>，则必须在<c>SaveChanges(Boolean)</c> 之后调用<c>AcceptAllChanges</c>方法。 </param>
        /// <returns>在调用<c>SaveChanges</c>时处于<c>Added</c>、<c>Modified</c>或<c>Deleted</c>状态的对象数。</returns>
        public static int SaveChanges(this DbContext context, bool acceptChangesDuringSave)
        {
            //转调
            return SaveChanges(context, acceptChangesDuringSave ? (SaveOptions.DetectChangesBeforeSave | SaveOptions.AcceptAllChangesAfterSave) : SaveOptions.DetectChangesBeforeSave);
        }

        /// <summary>
        /// 接受在对象上下文中对对象所做的所有更改。
        /// </summary>
        /// <param name="context">要执行保存操作的<see cref="DbContext" />对象。</param>
        public static void AcceptAllChanges(this DbContext context)
        {
            //转调
            ((IObjectContextAdapter)context).ObjectContext.AcceptAllChanges();
        }
    }
}
